package widgets;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;


public class TableGrid extends AbstractTableModel {  

    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	// Lista de Elementos a serem exibidos na tabela  
    private List<TableGridElement> linhas;  
 
    // Array com os nomes das colunas.  
    private String[] colunas = new String[] { "Id", "Info", "Tipo" }; 

 // Constantes representando o �ndice das colunas  

    private static final int ID = 0; 
    private static final int NOME = 1;  
    private static final int TIPO = 2; 


    // Cria um ElementoTableModel sem nenhuma linha  
    public TableGrid() {  
        linhas = new ArrayList<TableGridElement>();  
    }  

    // Cria um ElementoTableModel contendo a lista recebida por par�metro  
    public TableGrid(List<TableGridElement> listaDeElementos) {  

        linhas = new ArrayList<TableGridElement>(listaDeElementos);  
    }
    
    public int getRowCount() {  
        return linhas.size();  
    } 

    
    public int getColumnCount() {  
        return colunas.length;  
    } 

    public String getColumnName(int columnIndex) {  

        return colunas[columnIndex];  

    }
    
    public Class<?> getColumnClass(int columnIndex) {  

        switch (columnIndex) {  

        case ID:  

            return String.class; 
            
        case NOME:  

            return String.class;  

        case TIPO:  

            return String.class;   

        default:  

            // N�o deve ocorrer, pois s� existem 3 colunas  
            throw new IndexOutOfBoundsException("columnIndex out of bounds");  

        }  

    } 
    
    public boolean isCellEditable(int rowIndex, int columnIndex) {  

        return false;  

    } 

    public Object getValueAt(int rowIndex, int columnIndex) {  

        // Pega o elemento referente a linha especificada.  

        TableGridElement elemento = linhas.get(rowIndex);  

        switch (columnIndex) {  

        case ID:  

            return elemento.getId(); 
            
        case NOME:  

            return elemento.getNome();  

        case TIPO:  

            return elemento.getTipo();  
            
        default:  

            // N�o deve ocorrer, pois s� existem 3 colunas  
            throw new IndexOutOfBoundsException("columnIndex out of bounds");  

        }  

    }
    
    
    // Como as c�lulas n�o ser�o editaveis, esse m�todo ser� desnecess�rio
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  

        // Pega o elemento referente a linha especificada.  

        TableGridElement elemento = linhas.get(rowIndex);  

        switch (columnIndex) {  

        case NOME:  

            elemento.setNome((String) aValue);  

            break;  

        case TIPO:  

            elemento.setTipo((String) aValue);  

            break;  

        default:  

            // N�o deve ocorrer, pois s� existem 2 colunas  
            throw new IndexOutOfBoundsException("columnIndex out of bounds");  

        }  

           

        fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualiza��o da c�lula  

    }
    
    
 // Retorna o elemento referente a linha especificada  

    public TableGridElement getElemento(int indiceLinha) {  

        return linhas.get(indiceLinha);  

    }  

    // Adiciona o elemento especificado ao modelo  

    public void addElemento(TableGridElement elemento) {  

        // Adiciona o registro.  

        linhas.add(elemento);  

        // Pega a quantidade de registros e subtrai 1 para  

        // achar o �ltimo �ndice. A subtra��o � necess�ria  

        // porque os �ndices come�am em zero.  

        int ultimoIndice = getRowCount() - 1;  

        // Notifica a mudan�a.  

        fireTableRowsInserted(ultimoIndice, ultimoIndice);  

    }  

    // Remove o elemento da linha especificada.  

    public void removeElemento(int linhasSelecionadas[]) {  

    	
        
    	// Remove o registro.  
    	for (int j = linhasSelecionadas.length -1; j>= 0; j--) {
        linhas.remove(linhasSelecionadas[j]);
        fireTableRowsDeleted(linhasSelecionadas[j], linhasSelecionadas[j]);  
    	}
        // Notifica a mudan�a.  

        

    }  

    // Adiciona uma lista de s�cios no final da lista.  

    public void addListaDeElementos(List<TableGridElement> elementos) {  

        // Pega o tamanho antigo da tabela, que servir�  

        // como �ndice para o primeiro dos novos registros  

        int indice = getRowCount();  

        // Adiciona os registros.  

        linhas.addAll(elementos);  

        // Notifica a mudan�a.  

        fireTableRowsInserted(indice, indice + elementos.size());  

    }  

    // Remove todos os registros.  

    public void clear() {  

        // Remove todos os elementos da lista de s�cios.  

        linhas.clear();  

        // Notifica a mudan�a.  

        fireTableDataChanged();  

    } 

}





